LifeExpIncom <- read.csv(file = "https://raw.githubusercontent.com/azheneghan/aheneghan/main/datasets/LifeExpIncom.csv")
data2015 <- LifeExpIncom %>%
  filter(year == "2015")

1 Interactive Scatterplot of Life Expectancy vs. Income in 2015

cols1 <- c("#648FFF","darkorchid3","#DC267F","#FE6100","#FFB000")
cols1 <- setNames(cols1, c("Africa", "Americas", "Asia", "Europe", "Oceania"))

plot_ly(
    data = data2015,
    x = ~income, y = ~life.expectancy, color = ~factor(region), colors = cols1,
        text = ~paste("Country: ", country,
                   "<br>Population Size: ", population.size),
     ## using the following hovertemplate() to add the information of the
     ## Two numerical variables to the hover text.
     hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
                           '<br><b>Income</b>: %{x}',
                           '<br><b>%{text}</b>'),
     alpha = 0.6,
     marker = list(size = ~population.size^(1/10), sizeref = .05, sizemode = 'area'),
     type = "scatter",
     mode = "markers",
     ## graphic size
     width = 700,
     height = 500
   ) %>%
    layout(  
      ### Title 
      title =list(text = "Association Between Life Expectancy and Income", 
                  font = list(family = "Arial", 
                                size = 18,
                               color = "blue")), 
      ### legend
      legend = list(title = list(text = 'Region',
                                 font = list(family = "Courier New",
                                               size = 14,
                                              color = "black")),
                    bgcolor = "beige",
                    bordercolor = "navy",
                    groupclick = "togglegroup",
                    orientation = "v"
                    ),
      margin = list(
              b = 100,
              l = 100,
              t = 100,
              r = 50
      ),
      ## Background
      plot_bgcolor ='#f7f7f7', 
      ## Axes labels
            xaxis = list( 
                    title=list(text = 'Income',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'white', 
                    zerolinewidth = 2, 
                    gridcolor = 'white'), 
            yaxis = list( 
                    title=list(text = 'Life Expectancy',
                               font = list(family = 'Arial')),
                    zerolinecolor = 'white', 
                    zerolinewidth = 2, 
                    gridcolor = 'white',
                    range=c(48,85)),
       ## annotations
       annotations = list(  
                     x = 0.7,   # between 0 and 1. 0 = left, 1 = right
                     y = 1.5,   # between 0 and 1, 0 = bottom, 1 = top
                  font = list(size = 12,
                              color = "navy"),   
                  text = "The point size is proportional to country's population size",   
                  xref = "paper",  # "container" spans the entire `width` of the 
                                   #  lot. "paper" refers to the width of the 
                                   #  plotting area only. yref = "paper",  
                                   #  same as xref.
               xanchor = "center", #  horizontal alignment with respect to its x position
               yanchor = "bottom", #  similar to xanchor  
             showarrow = FALSE)
    )

This scatterplot uses income and life expectancy of each country during the year of 2015 as the two variables defining the axes. Therefore, they will be the variables to be compared. The size of each point represents that country’s population size during the year 2015. The color of each point represents the region or continent in which each country resides. During the year 2015, it seemed like over half the countries had low incomes below $30,000, especially those in Africa. Most African countries also had the lowest life expectancies. Those with larger incomes tended to be in Asia and Europe. The common pattern here is that life expectancy tended to increase only if income increased as well. This demonstrates that countries, and those who live in them, need a relatively large yearly income and number of resources in order for those living in these countries to live longer lives. Unfortunately, that is the opposite case with Africa, who tend to have countries with low income and, therefore, lower life expectancies. It should also be said that life expectancy seems to level out between 75 and 85 years when countries have incomes of $30,000 or greater.

2 Animated Scatterplot of Life Expectancy vs. Income Over the Years

cols1 = c("#648FFF","darkorchid3","#DC267F","#FE6100","#FFB000","#882255")
lifeExp.anime <- ggplot(LifeExpIncom, aes(income, life.expectancy, 
                  size = population.size, colour = region)) +
           geom_point(alpha = 0.7) +
           scale_colour_manual(values = country_colors) +
           scale_size(range = c(2, 12)) + scale_x_log10() +
           labs(title = 'Year: {frame_time}', 
                    x = 'Income',
                    y = 'Life Expectancy') +
           transition_time(year) +
           ease_aes('linear') + scale_color_manual(values = cols1)
###
animate(lifeExp.anime, fps=3, duration = 20, renderer = gifski_renderer())

This scatterplot uses income and life expectancy of each country between 1800 and 2018 as the two variables defining the axes. Therefore, they will be the variables to be compared. The size of each point represents that country’s population size. The color of each point represents the region or continent in which each country resides. From 1800 to 2018, it is seems apparent that income and life exxpectancy in all countries increased over time. Life expectancy seems to increase over time as income does as well. Income and life expectancy seemed to increase faster over the years for countries in Europe compared to other countries in other regions. On the other hand, countries in Africa had their income and life expectancies increase much slower compared to other regions. Most African countries had the lowest life expectancies of all for most years. Also, the speed of income and life expectancy for Asian countries over the years seemed to be mostly in between the speeds for European and African countries as already mentioned.

LS0tDQp0aXRsZTogIldvcmxkIExpZmUgRXhwZWN0YW5jeSBJbnRlcmFjdGl2ZSBhbmQgQW5pbWF0ZWQgU2NhdHRlcnBsb3RzIg0KYXV0aG9yOiAiQW5kcmV3IEhlbmVnaGFuIg0KZGF0ZTogIjMvNi8yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogVGFibGUgb2YgY29udGVudCAtIG5hdmlnYXRpb24gKi8NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogVGl0bGUgZm9udHMgKi8NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgZm9udC12YXJpYW50LWNhcHM6IG5vcm1hbDsNCn0NCg0KaDQuYXV0aG9yIHsNCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7DQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBkYXJrYmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQovKiBTZWN0aW9uIGhlYWRlcnMgKi8NCg0KaDEgew0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsNCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBEZWNvcmF0aW9uIG9mIGh5cGVybGlua3MgICovDQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IHB1cnBsZTsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQphOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogc2VsZWN0ZWQgbGluayAqLw0KYTphY3RpdmUgew0KICBjb2xvcjogeWVsbG93Ow0KfQ0KDQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCg0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0DQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCg0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpDQogICBsaWJyYXJ5KGRwbHlyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJjb3dwbG90IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQ0KICAgbGlicmFyeShjb3dwbG90KQ0KfQ0KaWYgKCFyZXF1aXJlKCJsYXRleDJleHAiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGF0ZXgyZXhwIikNCiAgIGxpYnJhcnkobGF0ZXgyZXhwKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInBuZyIpDQogICAgbGlicmFyeSgicG5nIikNCn0NCmlmICghcmVxdWlyZSgiUkN1cmwiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlJDdXJsIikNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2FuaW1hdGUiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnaWZza2kiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdpZnNraSIpICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnckRldmljZXMiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJqcGVnIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJqcGVnIikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgianBlZyIpDQp9DQppZiAoIXJlcXVpcmUoIlZHQU0iKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJWR0FNIikNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIk1BU1MiKQ0KfQ0KaWYgKCFyZXF1aXJlKCJubmV0IikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJubmV0IikgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibm5ldCIpDQp9DQppZiAoIXJlcXVpcmUoImNsdXN0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKSAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJjbHVzdGVyIikNCn0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCmBgYHtyfQ0KTGlmZUV4cEluY29tIDwtIHJlYWQuY3N2KGZpbGUgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2F6aGVuZWdoYW4vYWhlbmVnaGFuL21haW4vZGF0YXNldHMvTGlmZUV4cEluY29tLmNzdiIpDQpkYXRhMjAxNSA8LSBMaWZlRXhwSW5jb20gJT4lDQogIGZpbHRlcih5ZWFyID09ICIyMDE1IikNCmBgYA0KDQojIEludGVyYWN0aXZlIFNjYXR0ZXJwbG90IG9mIExpZmUgRXhwZWN0YW5jeSB2cy4gSW5jb21lIGluIDIwMTUNCg0KYGBge3J9DQpjb2xzMSA8LSBjKCIjNjQ4RkZGIiwiZGFya29yY2hpZDMiLCIjREMyNjdGIiwiI0ZFNjEwMCIsIiNGRkIwMDAiKQ0KY29sczEgPC0gc2V0TmFtZXMoY29sczEsIGMoIkFmcmljYSIsICJBbWVyaWNhcyIsICJBc2lhIiwgIkV1cm9wZSIsICJPY2VhbmlhIikpDQoNCnBsb3RfbHkoDQogICAgZGF0YSA9IGRhdGEyMDE1LA0KICAgIHggPSB+aW5jb21lLCB5ID0gfmxpZmUuZXhwZWN0YW5jeSwgY29sb3IgPSB+ZmFjdG9yKHJlZ2lvbiksIGNvbG9ycyA9IGNvbHMxLA0KICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHJ5OiAiLCBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbiBTaXplOiAiLCBwb3B1bGF0aW9uLnNpemUpLA0KICAgICAjIyB1c2luZyB0aGUgZm9sbG93aW5nIGhvdmVydGVtcGxhdGUoKSB0byBhZGQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZQ0KICAgICAjIyBUd28gbnVtZXJpY2FsIHZhcmlhYmxlcyB0byB0aGUgaG92ZXIgdGV4dC4NCiAgICAgaG92ZXJ0ZW1wbGF0ZSA9IHBhc3RlKCc8aT48Yj5MaWZlIEV4cGVjdGFuY3k8Yj48L2k+OiAle3l9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+SW5jb21lPC9iPjogJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPiV7dGV4dH08L2I+JyksDQogICAgIGFscGhhID0gMC42LA0KICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSB+cG9wdWxhdGlvbi5zaXplXigxLzEwKSwgc2l6ZXJlZiA9IC4wNSwgc2l6ZW1vZGUgPSAnYXJlYScpLA0KICAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgICBtb2RlID0gIm1hcmtlcnMiLA0KICAgICAjIyBncmFwaGljIHNpemUNCiAgICAgd2lkdGggPSA3MDAsDQogICAgIGhlaWdodCA9IDUwMA0KICAgKSAlPiUNCiAgICBsYXlvdXQoICANCiAgICAgICMjIyBUaXRsZSANCiAgICAgIHRpdGxlID1saXN0KHRleHQgPSAiQXNzb2NpYXRpb24gQmV0d2VlbiBMaWZlIEV4cGVjdGFuY3kgYW5kIEluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkFyaWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIikpLCANCiAgICAgICMjIyBsZWdlbmQNCiAgICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAnUmVnaW9uJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJDb3VyaWVyIE5ldyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKSwNCiAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICJiZWlnZSIsDQogICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIm5hdnkiLA0KICAgICAgICAgICAgICAgICAgICBncm91cGNsaWNrID0gInRvZ2dsZWdyb3VwIiwNCiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAidiINCiAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgIG1hcmdpbiA9IGxpc3QoDQogICAgICAgICAgICAgIGIgPSAxMDAsDQogICAgICAgICAgICAgIGwgPSAxMDAsDQogICAgICAgICAgICAgIHQgPSAxMDAsDQogICAgICAgICAgICAgIHIgPSA1MA0KICAgICAgKSwNCiAgICAgICMjIEJhY2tncm91bmQNCiAgICAgIHBsb3RfYmdjb2xvciA9JyNmN2Y3ZjcnLCANCiAgICAgICMjIEF4ZXMgbGFiZWxzDQogICAgICAgICAgICB4YXhpcyA9IGxpc3QoIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZT1saXN0KHRleHQgPSAnSW5jb21lJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnQXJpYWwnKSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnd2hpdGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnKSwgDQogICAgICAgICAgICB5YXhpcyA9IGxpc3QoIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZT1saXN0KHRleHQgPSAnTGlmZSBFeHBlY3RhbmN5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAnQXJpYWwnKSksDQogICAgICAgICAgICAgICAgICAgIHplcm9saW5lY29sb3IgPSAnd2hpdGUnLCANCiAgICAgICAgICAgICAgICAgICAgemVyb2xpbmV3aWR0aCA9IDIsIA0KICAgICAgICAgICAgICAgICAgICBncmlkY29sb3IgPSAnd2hpdGUnLA0KICAgICAgICAgICAgICAgICAgICByYW5nZT1jKDQ4LDg1KSksDQogICAgICAgIyMgYW5ub3RhdGlvbnMNCiAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoICANCiAgICAgICAgICAgICAgICAgICAgIHggPSAwLjcsICAgIyBiZXR3ZWVuIDAgYW5kIDEuIDAgPSBsZWZ0LCAxID0gcmlnaHQNCiAgICAgICAgICAgICAgICAgICAgIHkgPSAxLjUsICAgIyBiZXR3ZWVuIDAgYW5kIDEsIDAgPSBib3R0b20sIDEgPSB0b3ANCiAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIm5hdnkiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgaXMgcHJvcG9ydGlvbmFsIHRvIGNvdW50cnkncyBwb3B1bGF0aW9uIHNpemUiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAjICJjb250YWluZXIiIHNwYW5zIHRoZSBlbnRpcmUgYHdpZHRoYCBvZiB0aGUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGxvdC4gInBhcGVyIiByZWZlcnMgdG8gdGhlIHdpZHRoIG9mIHRoZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgcGxvdHRpbmcgYXJlYSBvbmx5LiB5cmVmID0gInBhcGVyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBzYW1lIGFzIHhyZWYuDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsICMgIGhvcml6b250YWwgYWxpZ25tZW50IHdpdGggcmVzcGVjdCB0byBpdHMgeCBwb3NpdGlvbg0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCAjICBzaW1pbGFyIHRvIHhhbmNob3IgIA0KICAgICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFKQ0KICAgICkNCmBgYA0KDQpUaGlzIHNjYXR0ZXJwbG90IHVzZXMgaW5jb21lIGFuZCBsaWZlIGV4cGVjdGFuY3kgb2YgZWFjaCBjb3VudHJ5IGR1cmluZyB0aGUgeWVhciBvZiAyMDE1IGFzIHRoZSB0d28gdmFyaWFibGVzIGRlZmluaW5nIHRoZSBheGVzLiBUaGVyZWZvcmUsIHRoZXkgd2lsbCBiZSB0aGUgdmFyaWFibGVzIHRvIGJlIGNvbXBhcmVkLiBUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IHJlcHJlc2VudHMgdGhhdCBjb3VudHJ5J3MgcG9wdWxhdGlvbiBzaXplIGR1cmluZyB0aGUgeWVhciAyMDE1LiBUaGUgY29sb3Igb2YgZWFjaCBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb3IgY29udGluZW50IGluIHdoaWNoIGVhY2ggY291bnRyeSByZXNpZGVzLiBEdXJpbmcgdGhlIHllYXIgMjAxNSwgaXQgc2VlbWVkIGxpa2Ugb3ZlciBoYWxmIHRoZSBjb3VudHJpZXMgaGFkIGxvdyBpbmNvbWVzIGJlbG93ICQzMCwwMDAsIGVzcGVjaWFsbHkgdGhvc2UgaW4gQWZyaWNhLiBNb3N0IEFmcmljYW4gY291bnRyaWVzIGFsc28gaGFkIHRoZSBsb3dlc3QgbGlmZSBleHBlY3RhbmNpZXMuIFRob3NlIHdpdGggbGFyZ2VyIGluY29tZXMgdGVuZGVkIHRvIGJlIGluIEFzaWEgYW5kIEV1cm9wZS4gVGhlIGNvbW1vbiBwYXR0ZXJuIGhlcmUgaXMgdGhhdCBsaWZlIGV4cGVjdGFuY3kgdGVuZGVkIHRvIGluY3JlYXNlIG9ubHkgaWYgaW5jb21lIGluY3JlYXNlZCBhcyB3ZWxsLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGF0IGNvdW50cmllcywgYW5kIHRob3NlIHdobyBsaXZlIGluIHRoZW0sIG5lZWQgYSByZWxhdGl2ZWx5IGxhcmdlIHllYXJseSBpbmNvbWUgYW5kIG51bWJlciBvZiByZXNvdXJjZXMgaW4gb3JkZXIgZm9yIHRob3NlIGxpdmluZyBpbiB0aGVzZSBjb3VudHJpZXMgdG8gbGl2ZSBsb25nZXIgbGl2ZXMuIFVuZm9ydHVuYXRlbHksIHRoYXQgaXMgdGhlIG9wcG9zaXRlIGNhc2Ugd2l0aCBBZnJpY2EsIHdobyB0ZW5kIHRvIGhhdmUgY291bnRyaWVzIHdpdGggbG93IGluY29tZSBhbmQsIHRoZXJlZm9yZSwgbG93ZXIgbGlmZSBleHBlY3RhbmNpZXMuIEl0IHNob3VsZCBhbHNvIGJlIHNhaWQgdGhhdCBsaWZlIGV4cGVjdGFuY3kgc2VlbXMgdG8gbGV2ZWwgb3V0IGJldHdlZW4gNzUgYW5kIDg1IHllYXJzIHdoZW4gY291bnRyaWVzIGhhdmUgaW5jb21lcyBvZiAkMzAsMDAwIG9yIGdyZWF0ZXIuDQoNCg0KIyBBbmltYXRlZCBTY2F0dGVycGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgdnMuIEluY29tZSBPdmVyIHRoZSBZZWFycw0KDQpgYGB7cn0NCmNvbHMxID0gYygiIzY0OEZGRiIsImRhcmtvcmNoaWQzIiwiI0RDMjY3RiIsIiNGRTYxMDAiLCIjRkZCMDAwIiwiIzg4MjI1NSIpDQpsaWZlRXhwLmFuaW1lIDwtIGdncGxvdChMaWZlRXhwSW5jb20sIGFlcyhpbmNvbWUsIGxpZmUuZXhwZWN0YW5jeSwgDQogICAgICAgICAgICAgICAgICBzaXplID0gcG9wdWxhdGlvbi5zaXplLCBjb2xvdXIgPSByZWdpb24pKSArDQogICAgICAgICAgIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsNCiAgICAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb3VudHJ5X2NvbG9ycykgKw0KICAgICAgICAgICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCAxMikpICsgc2NhbGVfeF9sb2cxMCgpICsNCiAgICAgICAgICAgbGFicyh0aXRsZSA9ICdZZWFyOiB7ZnJhbWVfdGltZX0nLCANCiAgICAgICAgICAgICAgICAgICAgeCA9ICdJbmNvbWUnLA0KICAgICAgICAgICAgICAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScpICsNCiAgICAgICAgICAgdHJhbnNpdGlvbl90aW1lKHllYXIpICsNCiAgICAgICAgICAgZWFzZV9hZXMoJ2xpbmVhcicpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMxKQ0KIyMjDQphbmltYXRlKGxpZmVFeHAuYW5pbWUsIGZwcz0zLCBkdXJhdGlvbiA9IDIwLCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigpKQ0KYGBgDQoNClRoaXMgc2NhdHRlcnBsb3QgdXNlcyBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jeSBvZiBlYWNoIGNvdW50cnkgYmV0d2VlbiAxODAwIGFuZCAyMDE4IGFzIHRoZSB0d28gdmFyaWFibGVzIGRlZmluaW5nIHRoZSBheGVzLiBUaGVyZWZvcmUsIHRoZXkgd2lsbCBiZSB0aGUgdmFyaWFibGVzIHRvIGJlIGNvbXBhcmVkLiBUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IHJlcHJlc2VudHMgdGhhdCBjb3VudHJ5J3MgcG9wdWxhdGlvbiBzaXplLiBUaGUgY29sb3Igb2YgZWFjaCBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb3IgY29udGluZW50IGluIHdoaWNoIGVhY2ggY291bnRyeSByZXNpZGVzLiBGcm9tIDE4MDAgdG8gMjAxOCwgaXQgaXMgc2VlbXMgYXBwYXJlbnQgdGhhdCBpbmNvbWUgYW5kIGxpZmUgZXh4cGVjdGFuY3kgaW4gYWxsIGNvdW50cmllcyBpbmNyZWFzZWQgb3ZlciB0aW1lLiBMaWZlIGV4cGVjdGFuY3kgc2VlbXMgdG8gaW5jcmVhc2Ugb3ZlciB0aW1lIGFzIGluY29tZSBkb2VzIGFzIHdlbGwuIEluY29tZSBhbmQgbGlmZSBleHBlY3RhbmN5IHNlZW1lZCB0byBpbmNyZWFzZSBmYXN0ZXIgb3ZlciB0aGUgeWVhcnMgZm9yIGNvdW50cmllcyBpbiBFdXJvcGUgY29tcGFyZWQgdG8gb3RoZXIgY291bnRyaWVzIGluIG90aGVyIHJlZ2lvbnMuIE9uIHRoZSBvdGhlciBoYW5kLCBjb3VudHJpZXMgaW4gQWZyaWNhIGhhZCB0aGVpciBpbmNvbWUgYW5kIGxpZmUgZXhwZWN0YW5jaWVzIGluY3JlYXNlIG11Y2ggc2xvd2VyIGNvbXBhcmVkIHRvIG90aGVyIHJlZ2lvbnMuIE1vc3QgQWZyaWNhbiBjb3VudHJpZXMgaGFkIHRoZSBsb3dlc3QgbGlmZSBleHBlY3RhbmNpZXMgb2YgYWxsIGZvciBtb3N0IHllYXJzLiBBbHNvLCB0aGUgc3BlZWQgb2YgaW5jb21lIGFuZCBsaWZlIGV4cGVjdGFuY3kgZm9yIEFzaWFuIGNvdW50cmllcyBvdmVyIHRoZSB5ZWFycyBzZWVtZWQgdG8gYmUgbW9zdGx5IGluIGJldHdlZW4gdGhlIHNwZWVkcyBmb3IgRXVyb3BlYW4gYW5kIEFmcmljYW4gY291bnRyaWVzIGFzIGFscmVhZHkgbWVudGlvbmVkLg0K